package com.cskaoyan.duolai.clean.pay.service.impl;

import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.cskaoyan.duolai.clean.pay.enums.PayChannelEnum;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.cskaoyan.duolai.clean.pay.config.QRCodeConfig;
import com.cskaoyan.duolai.clean.pay.service.QRCodeService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Service
public class QRCodeServiceImpl implements QRCodeService {

    @Resource
    private QRCodeConfig qrCodeConfig;

    @Override
    public String generate(String content, PayChannelEnum payChannel) {
        QrConfig qrConfig = new QrConfig();
        //设置边距
        qrConfig.setMargin(this.qrCodeConfig.getMargin());
        //二维码颜色
        qrConfig.setForeColor(HexUtil.decodeColor(this.qrCodeConfig.getForeColor()));
        //设置背景色
        qrConfig.setBackColor(HexUtil.decodeColor(this.qrCodeConfig.getBackColor()));
        //纠错级别
        qrConfig.setErrorCorrection(ErrorCorrectionLevel.valueOf(this.qrCodeConfig.getErrorCorrectionLevel()));
        //设置宽
        qrConfig.setWidth(this.qrCodeConfig.getWidth());
        //设置高
        qrConfig.setHeight(this.qrCodeConfig.getHeight());
        if (ObjectUtil.isNotEmpty(payChannel)) {
            //设置logo
            qrConfig.setImg(this.qrCodeConfig.getLogo(payChannel));
        }
        return QrCodeUtil.generateAsBase64(content, qrConfig, ImgUtil.IMAGE_TYPE_PNG);
    }

    /**
     * 生成带过期时间的二维码
     *
     * @param content    二维码中的内容
     * @param payChannel 付款渠道
     * @param expireTime 过期时间
     * @return 图片base64数据
     */
    @Override
    public String generateWithExpireTime(String content, PayChannelEnum payChannel, LocalDateTime expireTime) {
        // 在二维码内容中添加过期时间信息
        String contentWithExpireTime = addExpireTimeToContent(content, expireTime);
        return generate(contentWithExpireTime, payChannel);
    }

    // 在二维码内容中添加过期时间信息
    private String addExpireTimeToContent(String content, LocalDateTime expireTime) {
        if (expireTime == null) {
            return content;
        }

        // 格式化过期时间为字符串
        String expireTimeStr = expireTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

        // 在原始内容后添加过期时间信息
        // 使用分隔符来区分原始内容和过期时间
        return content + "|expireTime=" + expireTimeStr;
    }

    @Override
    public String generate(String content) {
        return generate(content, null);
    }
}
